package DisciplinaTopico;

import DisciplinaTopicoView.DisciplinaDAO;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class DisciplinaDAOXML implements DisciplinaDAO
{
    LinkedList<Disciplina> listaDisciplinas;
    public static final String XML_DISCIPLINAS = "disciplinas.xml";


    public DisciplinaDAOXML() throws DisciplinaDAOException
    {
        readDisciplinas();
    }

        private void readDisciplinas() throws DisciplinaDAOException
    {
        readDisciplinas(XML_DISCIPLINAS);
    }

    private void readDisciplinas(String nomeArquivo) throws DisciplinaDAOException
    {
         XMLDecoder informacoesArquivo = null;

        try
        {
            File inputFile = new File(nomeArquivo);
            if(inputFile.exists())
            {
                try
                {
                    informacoesArquivo = new XMLDecoder(new FileInputStream(nomeArquivo));
                    listaDisciplinas = (LinkedList<Disciplina>)informacoesArquivo.readObject();
                }
                finally
                {
                    if(informacoesArquivo != null)
                        informacoesArquivo.close();
                }
            }
            else
                listaDisciplinas = new LinkedList<Disciplina>();
        }
        catch(IOException exception)
        {
            DisciplinaDAOException disciplinaDAOException = new DisciplinaDAOException("ERRO: Não foi possível ler os dados do arquivo '" + nomeArquivo + "'.");

            disciplinaDAOException.setStackTrace(exception.getStackTrace());

            throw disciplinaDAOException;
        }
    }

     private void writeDisciplinas()throws DisciplinaDAOException
    {
        writeDisciplinas(XML_DISCIPLINAS);
    }

    private void writeDisciplinas(String nomeArquivo) throws DisciplinaDAOException
    {
        XMLEncoder informacoesArquivo = null;

        try
        {
            try
            {
                informacoesArquivo = new XMLEncoder(new FileOutputStream(nomeArquivo));
                informacoesArquivo.writeObject(listaDisciplinas);
            }
            finally
            {
                if(informacoesArquivo != null)
                    informacoesArquivo.close();
            }
        }
        catch(IOException exception)
        {
            DisciplinaDAOException disciplinaDAOException = new DisciplinaDAOException("ERRO: Não foi possível escrever todos os dados no arquivo '" + nomeArquivo + "'.");

            disciplinaDAOException.setStackTrace(exception.getStackTrace());

            throw disciplinaDAOException;
        }
    }

    public List<Disciplina> getDisciplinas() throws DisciplinaDAOException
    {
        return listaDisciplinas;
    }

        private boolean contemDisciplina(Disciplina disciplina)
    {
        for(Disciplina d : listaDisciplinas)
            if(d.equals(disciplina))
                return true;

        return false;
    }

    public void adicionarDisciplina(Disciplina novaDisciplina) throws DisciplinaDAOException
    {
        if (contemDisciplina(novaDisciplina))
        {
            throw new DisciplinaDAOException("ERRO: Disciplina já esta cadastrada no sistema.");
        }
        else
        {
            listaDisciplinas.add(novaDisciplina);
        }
        writeDisciplinas();
    }

    public void excluirDisciplina(Disciplina antigaDisciplina) throws DisciplinaDAOException
    {
        if (!contemDisciplina(antigaDisciplina))
        {
            throw new DisciplinaDAOException("ERRO: Disciplina não esta cadastrada no sistema.");
        }
        else
        {
             listaDisciplinas.remove(antigaDisciplina);
        }
        writeDisciplinas();
     }

    public void editarDisciplina(Disciplina disciplinaAlterada) throws DisciplinaDAOException
    {
        if(disciplinaAlterada == null)
            throw new DisciplinaDAOException("ERRO: A disciplina a ser alterada não é válida.");

        Disciplina disciplinaAntiga = null;

        
        for(Disciplina d : listaDisciplinas)
        {
            if(d.getID().equals(disciplinaAlterada.getID()))
            {
                disciplinaAntiga = d;
                break;
            }
        }

        if(disciplinaAntiga != null)
        {
            listaDisciplinas.remove(disciplinaAntiga);
            listaDisciplinas.add(disciplinaAlterada);

             writeDisciplinas();
        }
        else
            throw new DisciplinaDAOException("ERRO: A disciplina a ser alterada não esta cadastrada no banco, por favor cadastre esta disciplina.");
    }

}
